// =====================================================================================
// 
//       Filename:  StrategiaFurba.cpp
// 
//    Description:  Implementazione della strategia StrategiaPiuFurba
// 
//         Author:  Davide Poletti , davide.pole@gmail.com
//					Paolo Pigato , p.pigato@hotmail.com	
//        Company:  P&P.cpp
// 
// =====================================================================================

#include "StrategiaFurba.hh"

StrategiaFurba::StrategiaFurba() : Strategia()
{;}

pair<int,int> StrategiaFurba::spara(const Mare& mare)
{
    pair<int, int> coor;
    vector<pair<int, int> > colpite = cerca_colpite(mare);
    if (colpite.size() == 0){
        do {
            coor = coor_random(mare);
        } while (mare[coor]->sparata() && !mare.test_casella(coor));
        return coor;
    }
    coor = colpite[0];
    if (colpite.size() > 1){
        for(int angle = 0; angle < 4 ; angle++) {
            pair<int, int> coor_vic = mare.vai_successiva(coor, angle);
            if (mare.in_mare(coor_vic) && mare[coor_vic]->nave_qui()){
                pair<int, int> coor_opp = mare.vai_successiva(coor, (angle + 2)%4);
                if (mare.in_mare(coor_opp) && !mare[coor_opp]->sparata()){
                    return coor_opp;
                } else {
                    while (mare.in_mare(coor_vic) && mare[coor_vic]->nave_qui()){
                        coor_vic = mare.vai_successiva(coor_vic, angle);
                    }
                    if (mare.in_mare(coor_vic) && !mare[coor_vic]->sparata()){
                        return coor_vic;
                    }
                }
            }
        }
    }
    if (colpite.size() == 1){
        pair<int, int> coor_vic = coor;
        for (int angle = 0; mare[coor_vic]->sparata(); angle++){
            pair<int, int> adiacente = mare.vai_successiva(coor, angle);
            if (mare.in_mare(adiacente)){
                coor_vic = adiacente;
            }
        }
        return coor_vic;
    }
}

vector<pair<int, int> > StrategiaFurba::cerca_colpite(const Mare& mare)
{
    vector<pair<int, int> > colpite;
    pair<int,int> coor;
    int dim_mare = mare.dim_mare();
    for (int i = 0 ; i < dim_mare ; i++) {	
        for (int j = 0 ; j < dim_mare ; j++) {	
            coor =	pair<int,int>(i,j);                
            if(mare[coor]->nave_qui()){
                if (!mare[coor]->nave_qui()->affondata()){
                    cout << coor.first + 1 << " " << coor.second + 1 << endl;
                    colpite.push_back(coor);
                }
            }
        }
    }
    return colpite;
}
